The Power of Prediction: Microservice Auto Scaling via Workload Learning
作者信息
澳门大学须成忠老师和徐欢乐老师
链接:
The power of prediction | Proceedings of the 13th Symposium on Cloud Computing
摘要:
When deploying microservices in production clusters, it is critical to automatically scale containers to improve cluster utilization and ensure service level agreements (SLA). Although reactive scaling approaches work well for monolithic architectures, they are not necessarily suitable for microservice frameworks due to the long delay caused by complex microservice call chains. In contrast, existing proactive approaches leverage end-to-end performance prediction for scaling, but cannot effectively handle microservice multiplexing and dynamic microservice dependencies. In this paper, we present Madu, a proactive microservice auto-scaler that scales containers based on predictions for individual microservices. Madu learns workload uncertainty to handle the highly dynamic dependency between microservices. Additionally, Madu adopts OS-level metrics to optimize resource usage while maintaining good control over scaling
GPT概括:
背景和问题
- 微服务架构使服务更加灵活,但由于依赖链复杂且动态,传统的被动扩展方法(基于当前负载调整资源)在微服务环境中效果不佳,容易导致资源浪费和服务延迟。
- 现有的主动扩展方法尝试基于全局性能预测进行调整,但无法有效处理微服务的动态依赖性和多路复用性。
核心方法
- Madu 的设计目标:
- 针对单个微服务进行性能预测,而非整个服务依赖图。
- 通过学习工作负载的不确定性(包括动态依赖性引起的变化)提高预测准确性。
- 使用操作系统级指标(如 CPU 和内存利用率)优化资源分配,避免服务级响应时间的不足。
- 工作负载预测模型:
- 数据不确定性学习:通过对历史数据的分析,预测每个微服务的负载均值和方差。
- 注意力机制:采用随机注意力机制,结合动态依赖信息,进一步提高模型在高波动场景下的预测精度。
- 自动扩展模块:
- 根据预测的负载分布,动态调整容器数量,使资源利用率接近预设阈值。
- 利用凸优化方法,平滑资源扩展过程,避免频繁的扩展与缩减。
实验结果
- 预测精度:相比现有模型(如 ARIMA、Seq2Seq 和贝叶斯神经网络),Madu 的平均预测精度提高了 13%,特别是在高峰负载下减少了 40% 的低估误差。
- 资源利用:在真实集群实验中,Madu 比被动扩展方法减少了 1.7 倍的资源消耗,同时降低了端到端服务延迟 50%。
- 可扩展性:Madu 的分布式训练和在线预测机制适用于包含上千个微服务的大规模集群。
贡献
- 设计了适用于微服务场景的新型工作负载预测模型,能够处理复杂的动态依赖性。
- 提出了一种高效的主动扩展系统,结合预测和优化实现资源节约与性能提升。
- 在大型真实集群和开源微服务基准测试中验证了系统的有效性。
一句话总结概括
结合微服务工作负载不确定性学习和操作系统级指标,实现了更高效的主动扩展
Motivation
微服务依赖图:
- 动态依赖性:依赖图在结构上可能会动态变化
- 多路复用性:多个在线服务可能共享单个微服务
微服务负载不确定性(阿里数据):
- 一天内的周期性:高峰负载在每天相似时间出现
- 数据依赖的不确定性:峰值期间由其他微服务调用的非入口微服务不确定性很高,这取决于动态图的依赖拓扑
性能指标(阿里数据):
- 响应时间:其他方法普遍采用,但这种性能指标可能被其他下游微服务影响而不真实
- OS级别信息:如CPU或内存使用率,更真实地反映负载
创新点或贡献
理论创新:通过数据不确定性建模和随机注意力机制,提高了动态工作负载的预测精度。
系统设计:结合 OS 级指标和凸优化,提出了面向微服务的高效扩展框架。
性能验证:在大规模真实集群和基准测试中显著提升了资源利用率和服务性能,证明了方法的实用性。
具体设计
整体设计:
- 离线部分从工作负载数据中学习模型
- Workload Prediction Model
- Performance Profiling Model
- 在线部分根据预测模型和实时数据,计算容器需求并动态调整部署
负载预测模型:
建模假如涉及依赖性的话,性能开销会很大。因为一个微服务可能有100+个依赖的微服务。
采用Seq2Seq架构进行时间序列预测,输入过去n个时间的特征向量,输出未来m个时间的预测值。
对数据不确定性进行建模。
Madu 使用基于高斯分布(Gaussian Distribution)的概率模型对工作负载建模:
目标是预测未来时间步的工作负载分布,而不是单一值。
给定输入
$X_E$(历史工作负载特征序列),预测输出
$X_D$(未来负载序列)的分布参数:
- 均值$\mu(X_E)$:描述预测负载的中心趋势。
- 方差$\sigma^2(X_E)$:描述预测负载的波动范围。
目标公式
预测的分布模型定义为:
$X_D = f(X_E) + \epsilon \cdot \sigma(X_E)$
- $f(X_E)$:预测均值的函数,基于 Seq2Seq 模型学习。
- $\sigma(X_E)$:预测标准差的函数,用于刻画输入数据的不确定性。
- $\epsilon$:随机噪声,假设服从标准正态分布$\epsilon \sim \mathcal{N}(0, 1)$。
似然函数
通过最大化输出$X_D$ 的似然概率来优化模型参数 $W$:
$p(X_D \mid X_E, W) = \prod_t \frac{1}{\sqrt{2\pi \sigma^2(X_E)}} \exp\left(-\frac{(X_D - f(X_E))^2}{2\sigma^2(X_E)}\right)$
- 方差$\sigma^2(X_E)$ 会动态调整,使得模型在高波动时提高预测范围的宽度,在低波动时更精确。
定义损失函数
定义了新的损失函数:
$\mathcal{L} = \sum_t \left( \frac{(X_D - f(X_E))^2}{2\sigma^2(X_E)} + \frac{1}{2} \ln \sigma^2(X_E) \right)$
该损失函数的两个部分:
- 第一项:确保预测值$f(X_E)$ 与真实值 $X_D$ 之间的误差小。
- 方差较大时,误差的影响被削弱;方差较小时,模型更注重精确拟合。
- 第二项:引入正则化,抑制方差 $\sigma^2(X_E)$的过度增长。
- 第一项:确保预测值$f(X_E)$ 与真实值 $X_D$ 之间的误差小。
使用基于数据的不确定性注意力权重,使模型更关注高波动场景下的时间。
通过随机注意力机制(Stochastic Attention)增强对不确定性的建模,特别是在高波动负载场景下:
- 注意力机制的作用:
- 在输入序列中分配权重,突出对关键时间步的关注。
- 通过引入随机性,使模型能灵活应对动态负载的变化。
随机注意力的建模
权重分布:
- 注意力权重 $\alpha{t,j}$ 被建模为高斯分布: $p(\alpha{t,j} \mid XE, W) \sim \mathcal{N}(\mu{\alpha}(XE), \sigma{\alpha}^2(X_E))$
- 通过输入数据 XEXEXE 动态计算权重均值 $\mu{\alpha}$ 和方差 $\sigma_{\alpha}^2$。
上下文向量:
上下文向量 $cv_t$ 表示输入序列中不同时间步的加权和:
$cvt = \sum_j \alpha{t,j} h_{j}$
- $h_j$:输入序列的隐藏状态。
- $\alpha_{t,j}$:由随机注意力机制生成的动态权重。
输出预测:
- 利用上下文向量 $cv_t$ 生成最终的预测结果,包括均值和方差: $[\mu(X_E), \sigma(X_E)] = f(cv_t)$
- 注意力机制的作用:
性能预测模型:
线性性能建模:
对于每个微服务i,CPU 和内存的利用率分别建模为:
$\text{CPU Utilization} = a{\text{CPU},i} \cdot \text{CPM} + b{\text{CPU},i}$
$\text{Memory Utilization} = a{\text{Mem},i} \cdot \text{CPM} + b{\text{Mem},i}$
- 解释
- $\text{CPM}$:单位时间的调用数。
- $a{\text{CPU},i}, b{\text{CPU},i}$:CPU 利用率的线性回归系数。
- $a{\text{Mem},i}, b{\text{Mem},i}$:内存利用率的线性回归系数。
- 解释
资源估算:
在保证每个微服务的 CPU 和内存利用率低于预设阈值的条件下,最小化容器数量:
$\min_{c_i(t)} c_i(t)$
$\text{s.t. } \text{CPU Utilization} \leq T{\text{CPU}}, \quad \text{Memory Utilization} \leq T{\text{Mem}}$
- $c_i(t)$:微服务 iii 在时间 ttt 的容器数量。
- $T{\text{CPU}}$,$T{\text{Mem}}$:预设的 CPU 和内存利用率阈值。
基于回归模型,所需容器数量计算为:
$ci(t) = \max \left{ \left\lceil \frac{a{\text{CPU},i} \cdot Li(t)}{T{\text{CPU}} - b{\text{CPU},i}} \right\rceil, \left\lceil \frac{a{\text{Mem},i} \cdot Li(t)}{T{\text{Mem}} - b_{\text{Mem},i}} \right\rceil \right}$
- 公式解释
- $L_i(t)$:时间 ttt 的预测工作负载(CPM)。
- $\lceil \cdot \rceil$:向上取整,确保分配的容器数量为整数。
- 该公式根据 CPU 和内存的限制条件分别计算所需容器数量,并取二者的较大值。
扩缩容针对短期数据波动的优化:
简单贪心方案
最简单的扩展方案是贪心式优化,即在当前时间步内直接调整容器数量:
$x_i(t+1) = \max\left{\min\left{x_i(t), (1+\rho)\cdot c_i(t+1)\right}, c_i(t+1)\right}$
- 优点:计算简单,开销小。
- 缺点:贪心方案只考虑了两个相邻时间步,容易导致长期扩展决策的低效。
定义凸优化问题:
问题定义
定义扩展优化问题为一个凸优化问题,目标是在未来 mmm 个时间步内,最小化容器扩展数量的变化:
$\min{x_i(t+k)} \sum{k=1}^m \left( x_i(t+k-1) - x_i(t+k) \right)^2$
- 解释
- $x_i(t+k)$:时间步 $t+k$ 时的容器数量变化。
- 优化目标是让容器数量变化尽可能平滑,以减少扩展开销。
约束条件
扩展优化同时满足以下约束:
$c_i(t+k) \leq x_i(t+k) \leq (1 + \rho) \cdot c_i(t+k)$
- $c_i(t+k)$:根据预测负载和性能分析模块计算出的最低容器需求数量。
- $\rho$:扩展灵活性参数,允许容器数量在 $c_i(t+k)$的基础上有一定的波动。
- 解释
实验评估
背景
先前工作存在的问题概述
过去一种针对负载动态性的框架主要有:
- Reactive approaches:根据现在的workload和系统负载来调整
- 没有考虑到microservice call chain,chain的底部需要很长时间才会遇到工作负载的变化
- 缩放microservice需要在运行前花费几秒钟获取容器
- Proactive approaches:采用主动预测的方法,提前预测负载并扩缩容
- 效果还不错
- 但是没有考虑到microservice动态依赖关系和多路复用
- 在服务负载峰值时性能差异相比普通情况更大